package com.sc;

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import javax.naming.spi.ObjectFactory;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.Base64;
import java.util.List;

/**
 * 获取泛型
 */
public class GenericType1<T> {
}

//类B
interface B<T> {
}

//类C
class C {
}

//类D
interface D<T> {
}

//类C
class E {
}

//A实现B,向B传入实际类型参数C
class A implements B<List> {

    public static void main(String[] args) throws Exception {
        String sSrc ="{\"sysCode\":\"nxgovapp\",\"mobileNo\":\"13712348810\",\"latitude\":\"39.130945\",\"longitude\":\"106.707405\",\"name\":\"张三\",\"avatar\":\"http://abc.com/123.jpg\"}";
        String sKey = "AxsePck21Ab12345";
        byte[] raw = sKey.getBytes("utf-8");
        SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");//"算法/模式/补码方式"
        cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
        byte[] encrypted = cipher.doFinal(sSrc.getBytes("utf-8"));

//            return new Base64().encodeToString(encrypted);//此处使用BASE64做转码功能，同时能起到2次加密的作用。
        String s = Base64.getEncoder().encodeToString(encrypted);
        System.out.println(s);





//        A a = new A();
//        Type[] types = a.getClass().getGenericInterfaces();
//        for(Type type :types){
//            System.out.println(type);//结果是:B<C>
//        }

//        A a = new A();
//        //获得带有泛型的父类
//        Type type[] = a.getClass().getGenericInterfaces();
//        System.out.println(type);//结果是:B<C>
//        //将type强转成Parameterized
//        ParameterizedType pt = (ParameterizedType) type[0];
//        /*得到父类(参数化类型)中的泛型(实际类型参数)的实际类型。
//        getActualTypeArguments()返回一个Type数组，之所以返回Type数组,是因为一个类上有可能出现多个泛型，比如:Map<Integer,String>
//        */
//        Type actualTypes = pt.getActualTypeArguments()[0];
//        System.out.println(actualTypes);//结果:C
//        Class clz = (Class) actualTypes;
//        System.out.println(clz);


//        A a = new A();
//        //获得带有泛型的父类
//        Type type = a.getClass().getGenericSuperclass();
//        System.out.println(type);//结果是:B<C>
//        //将type强转成Parameterized
//        if (type instanceof ParameterizedType) {
//            ParameterizedType pt = (ParameterizedType) type;
////            得到父类(参数化类型)中的泛型(实际类型参数)的实际类型。
////            getActualTypeArguments()返回一个Type数组，之所以返回Type数组,是因为一个类上有可能出现多个泛型，比如:Map<Integer,String>
//            Type[] actualTypes = pt.getActualTypeArguments();
//            System.out.println(actualTypes[0]);//结果:C
//        }
    }
}